﻿
namespace FastFood.Windows.Forms.Administracion.Comestibles
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using FastFood.Business.Entities;
    using FastFood.Windows.Helpers;
    using FastFood.Business.Entities.Tipos;

    public partial class CwfDetCombos : UserControl
    {
        CwfPreparablesBusqueda preparablesBusqueda;
        CwfCombos _cwfCombos;
        private List<Combos_Insumos> _detallesInsumos;
        private List<Combos_Productos> _detallesProductos;
        public List<DetalleCombo> _listaPreparables;

        public CwfCombos miCwfCombos
        {
            set { _cwfCombos = value; }
        }
        public List<Combos_Insumos> detallesInsumos
        {
            get { return _detallesInsumos; }
        }
        public List<Combos_Productos> detallesProductos
        {
            get { return _detallesProductos; }
        }
        public List<DetalleCombo> ListaPreparables
        {
            set
            {
                _listaPreparables = value;
                _detallesInsumos = new List<Combos_Insumos>();
                _detallesProductos = new List<Combos_Productos>();

                if (value != null)
                {
                    foreach (DetalleCombo detalle in _listaPreparables)
                    {
                        if (detalle.tipo == TipoPreparable.Insumo) _detallesInsumos.Add(detalle.ConvertToDetalleInsumos());
                        else _detallesProductos.Add(detalle.ConvertToDetalleProductos());
                    }
                }
            }
        }
        public decimal costoActual, precioActual;
        public EstadoActual estadoActual;

        public CwfDetCombos()
        {
            InitializeComponent();
        }

        private void CwfPreparacion_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                ClearControls();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);

                preparablesBusqueda = new CwfPreparablesBusqueda();
                preparablesBusqueda.CwfPreparablesBusqueda_SeleccionEntidad += new GetObjeto(preparablesBusqueda_SeleccionEntidad);
                preparablesBusqueda.BorderStyle = BorderStyle.None;
                preparableCmb.DropDownControl = preparablesBusqueda;
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            
            this.preparableCmb.Focus();
            this.preparablesBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.preparableCmb.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.preparablesBindingSource.Current != null)
                {
                    LoadDetalle(this.preparablesBindingSource.Current as DetalleCombo);
                }
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.preparablesBindingSource.Current != null)
                    {
                        LoadDetalle(this.preparablesBindingSource.Current as DetalleCombo);
                    }

                    EnabledControls(true);
                    EnabledButtons(true);
                    this.preparablesDataGridView.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo || this.estadoActual == EstadoActual.Editar)
            {
                ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.preparablesBindingSource.CancelEdit();
            this.preparablesDataGridView.Focus();
        }
         
        private void insumosDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadDetalle(this.preparablesBindingSource.Current as DetalleCombo);
            }
        }

        private void preparacionDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.preparablesDataGridView.SelectedRows.Count != 0)
                {
                    if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                        if (this.preparablesBindingSource.Current != null)
                        {
                            LoadDetalle(this.preparablesBindingSource.Current as DetalleCombo);
                        }
                    }
                }
            }
        }

        public void InitialLoad()
        {
            try
            {
                if (_listaPreparables == null) ListaPreparables = new List<DetalleCombo>();
                preparablesBindingSource.DataSource = new List<DetalleCombo>(_listaPreparables);
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadDetalle(DetalleCombo detalle)
        {
            this.preparableCmb.Text = detalle.nombre;
            this.preparableIDLabel.Text = detalle.preparableID.ToString();
            this.costoActual = detalle.costo;
            this.precioActual = detalle.precio;
            this.cantidadTextBox.Text = detalle.cantidad.ToString();
            this.tipoLabel.Text = Convert.ToInt32(detalle.tipo).ToString();
            //this.txtNombreInsumo.Text = preparacion.Insumos.nombre;
        }

        private bool SaveData()
        {
            DetalleCombo detalle, nuevoDetalle;
            bool result = false;

            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        detalle = GetDetalle();
                        _listaPreparables.Add(detalle);
                        if (detalle.tipo == TipoPreparable.Insumo) detallesInsumos.Add(detalle.ConvertToDetalleInsumos());
                        else detallesProductos.Add(detalle.ConvertToDetalleProductos());
                        break;
                    case EstadoActual.Editar:
                        int index = 0;
                        detalle = this.preparablesBindingSource.Current as DetalleCombo;
                        nuevoDetalle = GetDetalle();

                        foreach (DetalleCombo item in _listaPreparables)
                        {
                            if (item.preparableID.Equals(detalle.preparableID) && item.tipo.Equals(detalle.tipo))
                            {
                                _listaPreparables[index] = nuevoDetalle;
                                break;
                            }
                            index++;
                        }

                        if (detalle.tipo == TipoPreparable.Insumo)
                        {
                            foreach (Combos_Insumos item in detallesInsumos)
                            {
                                if (item.insumoID == detalle.preparableID)
                                {
                                    detallesInsumos.Remove(item);
                                    break;
                                }
                            }
                        }
                        else
                        {
                            foreach (Combos_Productos item in detallesProductos)
                            {
                                if (item.productoID == detalle.preparableID)
                                {
                                    detallesProductos.Remove(item);
                                    break;
                                }
                            }
                        }
                        if (nuevoDetalle.tipo == TipoPreparable.Insumo) detallesInsumos.Add(nuevoDetalle.ConvertToDetalleInsumos());
                        else detallesProductos.Add(nuevoDetalle.ConvertToDetalleProductos());
                        break;
                    case EstadoActual.Eliminar:
                        detalle = this.preparablesBindingSource.Current as DetalleCombo;
                        _listaPreparables.Remove(detalle);
                        this.preparablesBindingSource.RemoveCurrent();

                        if (detalle.tipo == TipoPreparable.Insumo)
                        {
                            foreach (Combos_Insumos item in detallesInsumos)
                            {
                                if (item.insumoID == detalle.preparableID)
                                {
                                    detallesInsumos.Remove(item);
                                    break;
                                }
                            }
                        }
                        else
                        {
                            foreach (Combos_Productos item in detallesProductos)
                            {
                                if (item.productoID == detalle.preparableID)
                                {
                                    detallesProductos.Remove(item);
                                    break;
                                }
                            }
                        }

                        break;
                }

                this.preparablesBindingSource.EndEdit();
                this._cwfCombos.Costo = getCostoTotal();
                this._cwfCombos.PrecioPreparables = getPrecioTotal();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        public decimal getCostoTotal()
        {
            decimal total = 0;
            foreach (DetalleCombo detalle in _listaPreparables)
            {
                total += detalle.costoTotal;
            }
            return total;
        }

        public decimal getPrecioTotal()
        {
            decimal total = 0;
            foreach (DetalleCombo detalle in _listaPreparables)
            {
                total += detalle.precioTotal;
            }
            return total;
        }

        private DetalleCombo GetDetalle()
        {
            return new DetalleCombo
            {
                preparableID = Convert.ToInt16(preparableIDLabel.Text),
                nombre = preparableCmb.Text,
                cantidad = Convert.ToByte(cantidadTextBox.Text),
                costo = costoActual,
                precio = precioActual,
                tipo = (TipoPreparable)(Convert.ToInt32(tipoLabel.Text))
            };
        }

        private bool ValidateData()
        {
            bool result = true;

            if (this.preparableIDLabel.Text=="-1")
            {
                this.errValidator.SetError(this.preparableCmb, "Seleccionar Insumo.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.preparableCmb, string.Empty);
            }

            if (string.IsNullOrEmpty(this.cantidadTextBox.Text))
            {
                this.errValidator.SetError(this.cantidadTextBox, "Ingresar Cantidad.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cantidadTextBox, string.Empty);
            }

            if (result)
            {
                int act = preparablesDataGridView.CurrentRow.Index;
                for (int i = 0; i < _listaPreparables.Count; i++)
                {
                    if (_listaPreparables[i].preparableID == Convert.ToInt16(preparableIDLabel.Text))
                    {
                        if (_listaPreparables[i].tipo == (TipoPreparable)Convert.ToInt32(tipoLabel.Text))
                        {
                            if (i != act)
                            {
                                this.errValidator.SetError(this.preparableCmb, "Este producto ya a sido asignado.");
                                result = false;
                                break;
                            }
                        }
                    }
                }
            }

            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.groupBox1.Enabled = !valor;
            this.preparablesDataGridView.Enabled = valor;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsbNuevo.Enabled = valor;
            this.TsbEditar.Enabled = valor;
            this.TsbEliminar.Enabled = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsbGuardar.Enabled = true;
                this.TsbCancelar.Enabled = true;
                this.preparablesDataGridView.Enabled = false;
            }
            else
            {
                this.TsbGuardar.Enabled = false;
                this.TsbCancelar.Enabled = false;
                this.preparablesDataGridView.Enabled = true;
            }
        }

        public void ClearControls()
        {
            comboIDLabel.Text = "-1";
            preparableCmb.Text = "[Seleccionar un producto]";
            costoActual = 0;
            precioActual = 0;
            cantidadTextBox.Text = string.Empty;
            preparableIDLabel.Text = "-1";
            errValidator.Clear();
        }

        private void insumoCmb_DropDown(object sender, EventArgs e)
        {
            preparablesBusqueda.limpiar();
            //preparableCmb.Text = "[Seleccionar un producto]";
        }

        private void insumoCmb_DropDownClosed(object sender, EventArgs e)
        {

        }

        public void preparablesBusqueda_SeleccionEntidad(object objeto)
        {
            Preparable preparable = (Preparable)objeto;
            preparableCmb.Text = preparable.nombre;
            costoActual = preparable.costo;
            precioActual = preparable.precio;
            tipoLabel.Text = Convert.ToInt32(preparable.tipo).ToString();
            preparableIDLabel.Text = preparable.preparableID.ToString();
            cantidadTextBox.Focus();
            preparableCmb.HideDropDown();
        }

        private void insumoCmb_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
            {
                preparableCmb.ShowDropDown();
            }
            else
                e.SuppressKeyPress = true;
        }

        public void MenuSoloConImagenes(bool estado)
        {
            this.TsMenu.SuspendLayout();
            if (estado)
            {
                TsbNuevo.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbEditar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbCancelar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbGuardar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbEliminar.DisplayStyle = ToolStripItemDisplayStyle.Image;
            }
            else
            {
                TsbNuevo.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbEditar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbCancelar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbGuardar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbEliminar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
            }
            this.TsMenu.ResumeLayout();
        }
    }
}
